// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`array.js 1`] = `
// @flow

type Foo = {};
var f: Foo = {};
export var arr = [f];
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// @flow

type Foo = {};
var f: Foo = {};
export var arr = [f];

`;

exports[`async_return.js 1`] = `
// @flow

export async function foo() {
  return 123;
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// @flow

export async function foo() {
  return 123;
}

`;

exports[`infer.js 1`] = `
/* @flow */

var Foo = {
  a: function(arg) {  // missing arg annotation
    return arg;
  },

  b: function(arg) {  // missing arg annotation
    return {
      bar: arg
    };
  },

  c: function(arg: string) {  // no return annotation required
    return {
      bar: arg
    };
  },

  d: function(arg: string): {
    bar: string
  } {
    return {
      bar: arg
    };
  },

  // return type annotation may be omitted, but if so, input positions on
  // observed return type (e.g. param types in a function type) must come
  // from annotations
  e: function(arg: string) {
    return function(x) {  // missing param annotation
      return x;
    }
  },

  // ...if the return type is annotated explicitly, this is unnecessary
  f: function(arg: string): (x:number) => number {
    return function(x) {  // no error
      return x;
    }
  }

};

var Bar = {
  a: Foo.a('Foo'),    // no annotation required

  // object property types are inferred, so make sure that this doesn't cause
  // us to also infer the parameter's type.
  b: Foo.b('bar'),    // no annotation required

  c: Foo.c('bar'),            // no annotation required

  d: Foo.d('bar'),            // no annotation required
};

module.exports = Foo, Bar;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/* @flow */

var Foo = {
  a: function(arg) {
    // missing arg annotation
    return arg;
  },

  b: function(arg) {
    // missing arg annotation
    return {
      bar: arg
    };
  },

  c: function(arg: string) {
    // no return annotation required
    return {
      bar: arg
    };
  },

  d: function(
    arg: string
  ): {
    bar: string
  } {
    return {
      bar: arg
    };
  },

  // return type annotation may be omitted, but if so, input positions on
  // observed return type (e.g. param types in a function type) must come
  // from annotations
  e: function(arg: string) {
    return function(x) {
      // missing param annotation
      return x;
    };
  },

  // ...if the return type is annotated explicitly, this is unnecessary
  f: function(arg: string): (x: number) => number {
    return function(x) {
      // no error
      return x;
    };
  }
};

var Bar = {
  a: Foo.a("Foo"), // no annotation required

  // object property types are inferred, so make sure that this doesn't cause
  // us to also infer the parameter's type.
  b: Foo.b("bar"), // no annotation required

  c: Foo.c("bar"), // no annotation required

  d: Foo.d("bar") // no annotation required
};

(module.exports = Foo), Bar;

`;
